题目描述
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
示例 1:
1 | 输入: 1 |
示例 2:
1 | 输入: 2 |
限制:
$1 <= n <= 11$
算法
(动态规划) $O(n^2)$
状态表示:f[i][j]
,表示投 $i$ 次总和为 $j$ 的方案数
状态计算:按照第 $i$ 次投掷的点数为 $1,2,3,4,5,6$ 划分成六个集合
假设第 $i$ 次投掷的点数为 $k$,则状态转移方程为 $f[i][j] = f[i - 1][j - k]$,对于每种情况计算方案数,最后求和。
边界:
- 初始值:$f[0][0] = 1$,由 $f[1][1] = 1$ 可以推出
- 答案:$f[n][n]、f[n][2n]、…、f[n][6n]$,分别除以总方案数 $6^n$,最后就是每种和出现的概率值。
时间复杂度
状态数量有 $6n^2$ 个,状态转移时间为 $O(1)$,所以时间复杂度为 $O(n^2)$。
状态数量 * 状态转移所需时间 = $n^2 * O(1)$ = $O(n^2)$。
空间复杂度
$O(n^2)$
C++ 代码
1 | class Solution { |